<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script src="/js/lodash.js"></script>
    <script>
        //    浅拷贝
        // let obj1 = {
        //     a: 1,
        //     b: [1, 2, 3]
        // }

        // Object.assign()//方法实现浅拷贝
        // let obj2 = Object.assign({}, obj1)
        // obj2.b[0] = 99;
        // console.log(obj1.b);//[99,2,3]
        // console.log(obj1);//{1,[99,2,3]}

        // obj2.b = 99;
        // console.log(obj2.b);//99
        // console.log(obj2);//{1, 99}

        //展开运算符实现浅拷贝
        // let obj1 = {
        //     a: 1,
        //     b: [1, 2, 3]
        // }
        // let obj2 = { ...obj1 }
        // console.log(obj2);//{1,[1,2,3]}

        // // obj2.b = 999
        // // console.log(obj2.b);//999

        // obj2.b[0] = 888
        // console.log(obj2);//obj2.b = 999没修改是{1,[888,2,3]} 修改了{1，999}

        // 深拷贝
        // 递归实现 深拷贝
        // function deepCopy(obj) {
        //     // 判断obj是不是或空
        //     if (typeof obj !== 'object' || obj === null) {
        //         return obj
        //     }
        //     // 判断obj是不是数组
        //     let result = Array.isArray(obj) ? [] : {};
        //     // 循环obj
        //     for (const key in obj) {
        //         // 检查key值在obj中是否存在
        //         if (obj.hasOwnProperty(key)) {
        //             // result[key]  =  obj.key的值
        //             result[key] = deepCopy(obj[key]);
        //         }
        //     }
        //     // 把得到的值返回出去
        //     return result
        // }
        // let obj1 = {
        //     a: 1,
        //     b: [1, 2, 3],
        // }
        // let obj2 = deepCopy(obj1)
        // obj2.b[0] = 99
        // console.log(obj1);//obj1：{1,[1,2,3]}
        // console.log(obj2); //obj2：{1,[99,2,3]}


        // 使用JSON.Stringify()和JSON.parse()字符串实现深拷贝
        // let obj1 = {
        //     a: 1,
        //     b: [1, 2, 3],
        //     c: function () { },
        //     d: undefined,
        // }
        // let obj2 = JSON.parse(JSON.stringify(obj1))
        // obj2.b[0] = 99
        // console.log(obj1);//{1,[1,2,3] undefined}
        // console.log(obj2);//{1,[99,2,3]}
        // console.log(obj2.c);//undefined
        // console.log(obj2.b);//[99,2,3]

        // 使用lodash实现深拷贝
        // const obj = {
        //     uname: 'pink',
        //     age: 18,
        //     hobby: ['乒乓球', '足球'],
        //     family: {
        //         baby: '小pink'
        //     }
        // }
        // const o = _.cloneDeep(obj)
        // console.log(o);
        // o.family.baby = '你好啊！'
        // console.log(obj);

        // 异常处理
        // throw '抛出异常！';
        // throw 42;
        // throw new Error('抛出异常信息！')
        // let error = new Error('异常消息')
        // throw error

        // try {
        //     const o = 100;
        //     o = 123;
        // } catch (error) {
        //     console.log(error.message);
        // }

        // try {
        //     const o = 100;
        //     o = 123;
        // } catch (error) {
        //     console.log(error.message);
        // } finally {
        //     // 不管有没有异常都执行
        //     console.log(111);
        // }

        // function validateAge(age) {
        //     if (typeof age !== 'number' || age <= 0) {
        //         throw new Error('年龄不符合正常范畴！')
        //     }
        //     return true
        // } try {
        //     let age = parseInt(prompt('输入您的年龄！'))
        //     validateAge(age)
        // } catch (error) {
        //     console.error('Error:', error.message);
        //     console.log('年龄无效!');
        // } finally {
        //     console.log('年龄验证完成！')
        // }

        // function readFile(filePath) {
        //     let file;
        //     try {
        //         file = openFile(filePath)
        //         //读取文件内容
        //         let content = file.read()
        //         console.log('File content:', content);

        //     } catch (error) {
        //         console.error('读取文件时出错：', error.message);

        //     } finally {
        //         if (file) {
        //             file.close()//确保文件总是被关闭
        //         }
        //     }
        // }
        // readFile('data.txt')

        // async function fetchData(url) {
        //     try {
        //         let response = await fetch(url);
        //         if (!response.ok) {
        //             throw new Error("Network response was not ok");
        //         }
        //         let data = await response.json();
        //         console.log("Data received:", data);
        //     } catch (error) {
        //         console.error("Fetch error:", error.message);
        //     } finally {
        //         console.log("Fetch operation complete");
        //     }
        // }

        // fetchData("https://www.baidu.com/");

        // call
        // function sayHi() {
        //     console.log(this);

        // }
        // let user = {
        //     name: '小明',
        //     age: 18,

        // }
        // let student = {
        //     name: '小红',
        //     age: 16,
        // }
        //调用函数并指定this
        // sayHi.call(user)//this值为user
        // sayHi.call(student)//this值为student
        // function counter(a, b) {
        //     return a + b
        // }
        // let resul = counter.call(null, 5, 5)
        // console.log(resul);

        // 普通函数
        // function sayHi() {
        //     console.log(this)
        // }
        // let user = {
        //     name: '小明',
        //     age: 18
        // }
        // // 调用 bind 指定 this 的值
        // let sayHello = sayHi.bind(user);
        // // 调用使用 bind 创建的新函数
        // sayHello()
        // 通过构造函数创建普通对象


    </script>
</body>

</html>